const { app, BrowserWindow, protocol } = require('electron');
const path = require('path');
const url = require('url');

// 保持对窗口对象的全局引用，防止JavaScript对象被垃圾回收时窗口被自动关闭
let mainWindow;

function createWindow() {
    // 创建浏览器窗口
    mainWindow = new BrowserWindow({
        width: 1200,
        height: 800,
        webPreferences: {
            preload: path.join(__dirname, 'preload.js'),
            // 禁用节点集成，提高安全性
            nodeIntegration: false,
            // 启用上下文隔离
            contextIsolation: true,
            // 启用远程模块
            enableRemoteModule: false
        }
    });

    // 加载应用的index.html
    const startUrl = process.env.ELECTRON_START_URL || 
        url.format({
            pathname: path.join(__dirname, '/dist/index.html'),
            protocol: 'file:',
            slashes: true
        });
    
    mainWindow.loadURL(startUrl);

    // 打开开发者工具
    if (process.env.NODE_ENV === 'development') {
        mainWindow.webContents.openDevTools();
    }

    // 窗口关闭时触发
    mainWindow.on('closed', function () {
        // 取消引用窗口对象，如果应用支持多窗口，通常会把多个窗口保存在一个数组中
        // 此时应该删除相应的元素
        mainWindow = null;
    });
}

// 注册自定义协议以解决跨域问题
function registerProtocol() {
    protocol.registerSchemesAsPrivileged([
        {
            scheme: 'app',
            privileges: {
                secure: true,
                standard: true,
                supportFetchAPI: true,
                bypassCSP: true,
                corsEnabled: true
            }
        }
    ]);
}

// Electron完成初始化并准备创建浏览器窗口时触发
app.on('ready', () => {
    // 注册协议
    registerProtocol();
    // 创建窗口
    createWindow();
});

// 所有窗口关闭时退出应用
app.on('window-all-closed', function () {
    // 在macOS上，除非用户用Cmd+Q确定退出，否则绝大部分应用及其菜单栏会保持激活
    if (process.platform !== 'darwin') {
        app.quit();
    }
});

app.on('activate', function () {
    // 在macOS上，当点击dock图标且没有其他窗口打开时，通常会重新创建一个窗口
    if (mainWindow === null) {
        createWindow();
    }
});

// 处理证书错误，自动忽略跨域限制
app.on('certificate-error', (event, webContents, url, error, certificate, callback) => {
    event.preventDefault();
    callback(true);
});

// 允许所有网络请求，忽略跨域限制
app.on('session-created', (session) => {
    session.webRequest.onBeforeSendHeaders((details, callback) => {
        // 允许跨域请求
        callback({ requestHeaders: { ...details.requestHeaders } });
    });

    session.webRequest.onHeadersReceived((details, callback) => {
        // 设置CORS头，允许所有来源
        callback({
            responseHeaders: {
                ...details.responseHeaders,
                'Access-Control-Allow-Origin': ['*'],
                'Access-Control-Allow-Methods': ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
                'Access-Control-Allow-Headers': ['Content-Type', 'Authorization']
            }
        });
    });
});